package fiado.dao.memory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import fiado.bean.Conta;
import fiado.exception.DaoException;


public class ContaDAO {
	
	public static final List<Conta> tabela = Collections.synchronizedList(new ArrayList<Conta>());

	public static int nextValue = 1;
	
	static {
		try {
			Conta c = criarConta(7, 1, "10/10/2010", Conta.DEVENDO, 10.5);
			ContaDAO.tabela.add(c);
			c = criarConta(7, 2, "11/10/2010", Conta.PAGO, 10.5);
			ContaDAO.tabela.add(c);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	private static Conta criarConta(
			int idPessoa, 
			int numConta,
			String data, 
			char status,
			double total) throws ParseException {
		Conta c = new Conta();
		
		c.setIdPessoa(idPessoa);
		c.setNumConta(numConta);
		if (data != null) {
			c.setData(new SimpleDateFormat("dd/MM/yyyy").parse(data));
		}
		c.setStatus(status);
		c.setTotal(total);
		return c;
	}
	
	private static List<Conta> copy(List<Conta> lista) {
		List<Conta> listaCopia = new ArrayList<Conta>();
		for (Conta p : lista) {
			listaCopia.add(copy(p));
		}
		return listaCopia;
	}
	
	private static Conta copy(Conta c) {
		Conta copy = new Conta();
		copy.setIdPessoa(c.getIdPessoa());
		copy.setNumConta(c.getNumConta());
		copy.setData(c.getData());
		copy.setStatus(c.getStatus());
		copy.setTotal(c.getTotal());
		return copy;
	}
	
	private int getProximoValorSequence() throws DaoException {
		return nextValue++;
	}
	
	public List<Conta> buscarTodos() throws DaoException {
		return copy(ContaDAO.tabela);
	}

	public List<Conta> buscarPorStatus(char status) throws DaoException {
		List<Conta> lista = new ArrayList<Conta>();

		for (Conta c : ContaDAO.tabela) {
			if (c.getStatus() == status) {
				lista.add(copy(c));
			}
		}

		return lista;
	}

	public Conta buscarPorId(Conta conta) throws DaoException {
		return buscarPorId(conta.getIdPessoa(), conta.getNumConta());
	}
	
	public Conta buscarPorId(int idPessoa, int numConta) throws DaoException {
		for (Conta c : ContaDAO.tabela) {
			if (c.getIdPessoa() == idPessoa && c.getNumConta() == numConta) {
				return copy(c);
			}
		}
		return null;
	}
	
	public void apagar(int idPessoa, int numConta) throws DaoException {
		Iterator<Conta> it = ContaDAO.tabela.iterator();
		while (it.hasNext()) {
			Conta c = it.next();
			if (c.getIdPessoa() == idPessoa && c.getNumConta() == numConta) {
				it.remove();
			}
		}
	}	
	
	public void apagar(Conta conta) throws DaoException {
		apagar(conta.getIdPessoa(), conta.getNumConta());
	}
	
	public void salvar(Conta conta) throws DaoException {
		Iterator<Conta> it = ContaDAO.tabela.iterator();
		while (it.hasNext()) {
			Conta p = it.next();
			if (p.getIdPessoa() == conta.getIdPessoa() && p.getNumConta() == conta.getNumConta()) {
				it.remove();
			}
		}
		ContaDAO.tabela.add(copy(conta));
	}
	

	public void criar(Conta conta) throws DaoException {
		PessoaDAO pessoaDAO = new PessoaDAO(); 
		if (pessoaDAO.buscarPorId(conta.getIdPessoa()) == null) {
			throw new IllegalArgumentException("fk violada");
		}
		int numConta = getProximoValorSequence();
		conta.setNumConta(numConta);
		conta.setData(new Date());
		ContaDAO.tabela.add(copy(conta));
	}
}
